cari

Rumah  >  Soal Jawab  >  teks badan

关于objective-c类方法与实例方法的一些疑问

之前都是在搞前端js
之后写ios开始慢慢接触objective-c
有个疑问

//实例方法调用
NSString *str1 = [[NSString alloc] initWithString:@"123123"];

//类方法调用
NSString *str2 = [NSString stringWithString@"123123"];

我的疑问可能用上面例子会不太能凸显出来
疑问在于,
实例方法必须创建一个实例后使用实例进行调用
也就是内存中必存在一个实例
如果我想不通过实例来达到某些操作
那在设计API时可以设计成类方法,这样就可以直接通过类名进行调用
但是这种情况难道就不会生成实例在内存中了吗??
或者说,虽然没有生成实例,但内存依然会分配空间
那如果

[XXXClass abc];
[XXXClass bcd];
[XXXClass cde];
[XXXClass def];

这种情况下,内存会分配多少块内存空间呢?
而但代码域(如方法内)结束后,内存空间又是否能正常释放呢?

巴扎黑巴扎黑2766 hari yang lalu459

membalas semua(2)saya akan balas

  • 阿神

    阿神2017-04-24 09:15:06

    Dalam contoh yang anda berikan, sama ada kaedah objek atau kaedah kelas, tujuannya adalah untuk mendapatkan contoh objek.
    Bagaimana anda boleh mengkonfigurasi objek anda tanpa memperuntukkan ruang memori terlebih dahulu?
    Mungkin ini adalah cara ia dilaksanakan dalam kaedah kelas:

    + (instancetype)stringWithString:(NSString *)string {
        NSString *str = [[self alloc]initWithString:string];
        return str;
    }

    balas
    0
  • PHPz

    PHPz2017-04-24 09:15:06

    Tekan dan tahan ctrl dan klik NSString untuk melihat.

    - (instancetype)initWithString:(NSString *)aString;
    + (instancetype)stringWithString:(NSString *)string;
    

    Lihat bahagian hadapan kedua-dua kaedah ini, satu ialah "-" dan satu lagi ialah "+"
    Dalam oc, jika anda mengisytiharkan kaedah dengan tanda tambah, anda boleh memanggil kaedah kelas ini tanpa instantiasi.
    Jika anda menggunakan tanda tolak untuk mengisytiharkan kaedah, anda perlu memperuntukkan objek terlebih dahulu sebelum anda boleh memanggil kaedah dalam kelas ini.

    balas
    0
  • Batalbalas