在objective-c中使用ivars和属性的这三种方式之间的语义差异是什么?
1.
@class MyOtherObject;
@interface MyObject {
}
@property (nonatomic, retain) MyOtherObject *otherObj;
Run Code Online (Sandbox Code Playgroud)
2.
#import "MyOtherObject.h"
@interface MyObject {
MyOtherObject *otherObj;
}
@property (nonatomic, retain) MyOtherObject *otherObj;
Run Code Online (Sandbox Code Playgroud)
3.
#import "MyOtherObject.h"
@interface MyObject {
MyOtherObject *otherObj;
}
Run Code Online (Sandbox Code Playgroud) 谁能解释通过self.attribute和通过访问实例属性之间的区别@attribute?
如果实例变量属于某个类,我可以@hello直接使用类实例访问实例变量(例如)吗?
class Hello
def method1
@hello = "pavan"
end
end
h = Hello.new
puts h.method1
Run Code Online (Sandbox Code Playgroud) 我有一些模块,我想在其中使用实例变量.我目前正在初始化它们:
module MyModule
def self.method_a(param)
@var ||= 0
# other logic goes here
end
end
Run Code Online (Sandbox Code Playgroud)
我也可以调用init方法来初始化它们:
def init
@var = 0
end
Run Code Online (Sandbox Code Playgroud)
但这意味着我必须记住要经常打电话给它.
有没有更好的方法呢?
我正在尝试测试以下方法:
def unprocess_move(board, move)
if move[0].instance_of?(Array)
multi_move = @multi_move.pop(2).reverse
multi_move.each do |single_move|
unapply_move(board, single_move)
end
else
board = unapply_move(board, move)
end
board
end
Run Code Online (Sandbox Code Playgroud)
我想为@multi_move设置状态,但我不想添加一个仅用于测试的访问器.没有访问器有没有办法这样做?谢谢.
指望int在Objective-C中始终初始化为0 是否安全?
更具体地说,当int新实例化具有ivars 的对象时,可以安全地假设其ivars的值为0吗?
class Hello
@hello = "hello"
def display
puts @hello
end
end
h = Hello.new
h.display
Run Code Online (Sandbox Code Playgroud)
我创建了上面的课程.它不打印任何东西.我认为在类声明期间设置了实例变量@hello.但是当我调用display方法时输出为'nil'.这样做的正确方法是什么?
我看到它在为iOS编码时建议应该使用属性来访问实例变量,因为这会给内存管理带来诸多好处.
这个建议并不适合我.我发现使用属性而不是普通的旧ivars只需要太多的代码,如果你对内存管理感到满意,我并没有真正看到它的好处.它真的那么重要吗?您管理实例变量的方法是什么?
我对Objective-C中的属性和实例变量感到困惑.
我在Aaron Hillegass的"Mac OS X的可可编程"中走了一半,一切都是合乎逻辑的.你会声明一个这样的类:
@class Something;
@interface MyClass : NSObject {
NSString *name;
NSArray *items;
Something *something;
IBOutlet NSTextField *myTextField;
}
@property (nonatomic, retain) NSString *name;
@property (nonatomic, retain) NSArray *items;
Run Code Online (Sandbox Code Playgroud)
由于其他对象需要操作我们的实例name和items实例变量,我们使用@property/ @synthesize为它们生成访问器/ 更改器.在我们的类中,我们不使用访问器/ mutator - 我们只是直接与实例变量交互.
something 只是我们将在我们的类中使用的实例变量,并且由于没有其他人需要使用它,我们不会为它创建一对访问器和变换器.
我们需要在UI中与文本字段进行交互,因此我们声明了IBOutlet它,连接它,我们就完成了.
都很合乎逻辑.
然而,在iPhone世界中,事情似乎有所不同.人们声明属性,为每一个实例变量,用于声明属性IBOutlets,并使用存取/存取器与实例变量相互作用中的类别(例如,他们会写[self setName:@"Test"],而不是name = @"Test").
为什么?到底是怎么回事?这些差异是否与iPhone有关?为所有实例变量声明属性,为IBOutlets自己的类声明属性以及在自己的类中使用访问器/变换器有什么好处?
我对ruby很新(我实际上是c#dev.),所以这个问题可能是一个菜鸟.我有一个像下面这样的类,我使用实例变量(数组)来避免使用大量的方法参数.
它按照我的预期工作,但这是一个很好的做法吗?实际上我不希望它有效,但我想类方法在其他语言中不能作为静态方法工作,所以我想知道这是不是一个好的做法,或者我是否会遇到诸如将这些变量作为类变量和乱码的问题一切都好了.
class DummyClass
def self.dummy_method1
@arr = []
# Play with that array
end
def self.dummy_method2
# use @arr for something else
end
end
Run Code Online (Sandbox Code Playgroud) ruby ×6
objective-c ×4
properties ×3
accessor ×1
cocoa ×1
cocoa-touch ×1
int ×1
ios ×1
module ×1
rspec ×1
syntax ×1