Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 8891575
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: June 14, 20262026-06-14T22:46:52+00:00 2026-06-14T22:46:52+00:00

The book iOS6 by Tutorials by Ray Wenderlich has a very nice chapter about

  • 0

The book “iOS6 by Tutorials” by Ray Wenderlich has a very nice chapter about writing more “modern” Objective-C code. In one section the books describes how to move iVars from the header of the class into the implementation file.
Since all iVars should be private this seems to be the right thing to do.

But so far I found 3 ways of doing so. Everyone is doing it differently.

1.) Put iVars under @implementantion inside a block of curly braces (This is how it is done in the book).

2.) Put iVars under @implementantion without block of curly braces

3.) Put iVars inside private Interface above the @implementantion (a class extension)

All these solutions seems to work fine and so far I haven’t noticed any difference in the behavior of my application.
I guess there is no “right” way of doing it but I need to write some tutorials and I want to choose only one way for my code.

Which way should I go?

Edit: I am only talking about iVars here. Not properties. Only additional variables the object needs only for itself and that should not be exposed to the outside.

Code Samples

1)

#import "Person.h"

@implementation Person
{
    int age;
    NSString *name;
}

- (id)init
{
    self = [super init];
    if (self)
    {
        age = 40;
        name = @"Holli";
    }
    return self;
}
@end

2)

#import "Person.h"

@implementation Person

int age;
NSString *name;


- (id)init
{
    self = [super init];
    if (self)
    {
        age = 40;
        name = @"Holli";
    }
    return self;
}
@end

3)

#import "Person.h"

@interface Person()
{
    int age;
    NSString *name;
}
@end

@implementation Person

- (id)init
{
    self = [super init];
    if (self)
    {
        age = 40;
        name = @"Holli";
    }
    return self;
}
@end
  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-06-14T22:46:53+00:00Added an answer on June 14, 2026 at 10:46 pm

    The ability to put instance variables in the @implementation block, or in a class extension, is a feature of the “modern Objective-C runtime”, which is used by every version of iOS, and by 64-bit Mac OS X programs.

    If you want to write 32-bit Mac OS X apps, you must put your instance variables in the @interface declaration. Chances are you don’t need to support a 32-bit version of your app, though. OS X has supported 64-bit apps since version 10.5 (Leopard), which was released over five years ago.

    So, let’s assume you are only writing apps that will use the modern runtime. Where should you put your ivars?

    Option 0: In the @interface (Don’t Do It)

    First, let’s go over why we don’t want to put instance variables in an @interface declaration.

    1. Putting instance variables in an @interface exposes details of the implementation to users of the class. This may lead those users (even yourself when using your own classes!) to rely on implementation details that they should not. (This is independent of whether we declare the ivars @private.)

    2. Putting instance variables in an @interface makes compiling take longer, because any time we add, change, or remove an ivar declaration, we have to recompile every .m file that imports the interface.

    So we don’t want to put instance variables in the @interface. Where should we put them?

    Option 2: In the @implementation without braces (Don’t Do It)

    Next, let’s discuss your option 2, “Put iVars under @implementantion without block of curly braces”. This does not declare instance variables! You are talking about this:

    @implementation Person
    
    int age;
    NSString *name;
    
    ...
    

    That code defines two global variables. It does not declare any instance variables.

    It’s fine to define global variables in your .m file, even in your @implementation, if you need global variables – for example, because you want all of your instances to share some state, like a cache. But you can’t use this option to declare ivars, because it doesn’t declare ivars. (Also, global variables private to your implementation should usually be declared static to avoid polluting the global namespace and risking link-time errors.)

    That leaves your options 1 and 3.

    Option 1: In the @implementation with braces (Do It)

    Usually we want to use option 1: put them in your main @implementation block, in braces, like this:

    @implementation Person {
        int age;
        NSString *name;
    }
    

    We put them here because it keeps their existence private, preventing the problems I described earlier, and because there’s usually no reason to put them in a class extension.

    So when do we want to use your option 3, putting them in a class extension?

    Option 3: In a class extension (Do It Only When Necessary)

    There’s almost never a reason to put them in a class extension in the same file as the class’s @implementation. We might as well just put them in the @implementation in that case.

    But occasionally we might write a class that’s big enough that we want to divide up its source code into multiple files. We can do that using categories. For example, if we were implementing UICollectionView (a rather big class), we might decide that we want to put the code that manages the queues of reusable views (cells and supplementary views) in a separate source file. We could do that by separating out those messages into a category:

    // UICollectionView.h
    
    @interface UICollectionView : UIScrollView
    
    - (id)initWithFrame:(CGRect)frame collectionViewLayout:(UICollectionViewLayout *)layout;
    @property (nonatomic, retain) UICollectionView *collectionViewLayout;
    // etc.
    
    @end
    
    @interface UICollectionView (ReusableViews)
    
    - (void)registerClass:(Class)cellClass forCellWithReuseIdentifier:(NSString *)identifier;
    - (void)registerNib:(UINib *)nib forCellWithReuseIdentifier:(NSString *)identifier;
    
    - (void)registerClass:(Class)viewClass forSupplementaryViewOfKind:(NSString *)elementKind withReuseIdentifier:(NSString *)identifier;
    - (void)registerNib:(UINib *)nib forSupplementaryViewOfKind:(NSString *)kind withReuseIdentifier:(NSString *)identifier;
    
    - (id)dequeueReusableCellWithReuseIdentifier:(NSString *)identifier forIndexPath:(NSIndexPath*)indexPath;
    - (id)dequeueReusableSupplementaryViewOfKind:(NSString*)elementKind withReuseIdentifier:(NSString *)identifier forIndexPath:(NSIndexPath*)indexPath;
    
    @end
    

    OK, now we can implement the main UICollectionView methods in UICollectionView.m and we can implement the methods that manage reusable views in UICollectionView+ReusableViews.m, which makes our source code a little more manageable.

    But our reusable view management code needs some instance variables. Those variables have to be exposed to the main class @implementation in UICollectionView.m, so the compiler will emit them in the .o file. And we also need to expose those instance variables to the code in UICollectionView+ReusableViews.m, so those methods can use the ivars.

    This is where we need a class extension. We can put the reusable-view-management ivars in a class extension in a private header file:

    // UICollectionView_ReusableViewsSupport.h
    
    @interface UICollectionView () {
        NSMutableDictionary *registeredCellSources;
        NSMutableDictionary *spareCellsByIdentifier;
    
        NSMutableDictionary *registeredSupplementaryViewSources;
        NSMutableDictionary *spareSupplementaryViewsByIdentifier;
    }
    
    - (void)initReusableViewSupport;
    
    @end
    

    We won’t ship this header file to users of our library. We’ll just import it in UICollectionView.m and in UICollectionView+ReusableViews.m, so that everything that needs to see these ivars can see them. We’ve also thrown in a method that we want the main init method to call to initialize the reusable-view-management code. We’ll call that method from -[UICollectionView initWithFrame:collectionViewLayout:] in UICollectionView.m, and we’ll implement it in UICollectionView+ReusableViews.m.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

The book 'Modern Compiler Design' is the nice book about compilers. In its source
The book X Power Tools has a chapter Display Specifications, where it states: Since
The book I'm reading about Erlang has exercises in the back of it and
The book of IronPython In Action has the following code to read python script
The book says about a small Windows.Forms program The Windows Forms classes are in
If Book aggregates Chapter which in turn aggregates Page, then what should be the
I'm reading the book 'Beginning F#', There's a short list for example code, to
I'm writing an app that relies heavily on access to the iPhone address book.
Book I’ learning from claims that intArray has two dimensions. But since calling intArray.GetLength(1)
According to the documentation with iOS6 an address book should be created using ABAddressBookCreateWithOptions.

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.